module fir_top
#(
    parameter DATAIN_WIDTH = 16,
    parameter DATAOUT_WIDTH = 32
)
(
    input rst_n,            //reset signal
    input fir_clk,          //fir working clock
    
    //fifo interface
    input wr_clk,
    input [DATAIN_WIDTH-1:0] data_in,
    input wr_en,
    //output [DATAOUT_WIDTH-1:0] data_out
    input rd_clk,
    output [DATAOUT_WIDTH-1:0] data_out,
    input rd_en
);
    //wr_fifo
    wire wr_en_wfifo;
    wire rd_en_wfifo;
    wire full_wfifo;
    wire empty_wfifo;
    wire [DATAIN_WIDTH-1:0] dout_wfifo;

    //fir_lowpass
    wire s_axis_data_tvalid;
    wire s_axis_data_tready;
    wire [DATAIN_WIDTH-1:0] s_axis_data_tdata;
    wire m_axis_data_tvalid;
    wire [DATAOUT_WIDTH-1:0] m_axis_data_tdata;

    //rd_fifo
    wire wr_en_rfifo;
    wire rd_en_rfifo;
    wire full_rfifo;
    wire empty_rfifo;

    //dds
    wire [7:0] dds_m_axis_data_sin;
    wire [7:0] dds_m_axis_data_tdata;
    wire dds_m_axis_data_tvalid;

    //wr_fifo <---> fir_lowpass,input
    assign wr_en_wfifo = wr_en & (~full_wfifo);
    assign rd_en_wfifo = s_axis_data_tready & (~empty_wfifo);
    // assign rd_en_wfifo = s_axis_data_tready ;


    //fir_lowpass <---> rd_fifo,wr_fifo,output
    assign s_axis_data_tvalid = rd_en_wfifo;
    assign s_axis_data_tdata  = dout_wfifo;

    //rd_fifo <---> fir_lowpass,output
    assign wr_en_rfifo = m_axis_data_tvalid & ~full_rfifo;
    assign rd_en_rfifo = rd_en & ~empty_rfifo; 

    wr_fifo_fir u_wr_fifo_fir (
    .rst(~rst_n         ),  // input wire rst
    .wr_clk(wr_clk      ),  // input wire wr_clk
    .rd_clk(fir_clk     ),  // input wire rd_clk
    .din(data_in        ),        // input wire [15 : 0] din
    .wr_en(wr_en_wfifo  ),    // input wire wr_en
    .rd_en(rd_en_wfifo  ),    // input wire rd_en
    .dout(dout_wfifo    ),      // output wire [15 : 0] dout
    .full(full_wfifo    ),      // output wire full
    .empty(empty_wfifo  )    // output wire empty
    );


    fir_compiler_1 u_fir_compiler_1(
//    fir_lowpass u_fir_lowpass (
    .aclk(fir_clk),                              // input wire aclk
    .s_axis_data_tvalid(s_axis_data_tvalid),  // input wire s_axis_data_tvalid
    .s_axis_data_tready(s_axis_data_tready),  // output wire s_axis_data_tready
    .s_axis_data_tdata(s_axis_data_tdata),    // input wire [15 : 0] s_axis_data_tdata
    .m_axis_data_tvalid(m_axis_data_tvalid),  // output wire m_axis_data_tvalid
    .m_axis_data_tdata(m_axis_data_tdata)    // output wire [31 : 0] m_axis_data_tdata
    );


    //----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
    rd_fifo_fir u_rd_fifo_fir (
    .rst(~rst_n),        // input wire rst
    .wr_clk(fir_clk),  // input wire wr_clk
    .rd_clk(rd_clk),  // input wire rd_clk
    .din(m_axis_data_tdata),        // input wire [31 : 0] din
    .wr_en(wr_en_rfifo),    // input wire wr_en
    .rd_en(rd_en_rfifo),    // input wire rd_en
    .dout(data_out),      // output wire [31 : 0] dout
    .full(full_rfifo),      // output wire full
    .empty(empty_rfifo)    // output wire empty
    );

//    dds_compiler_0 u_dds_compiler_0 (
//      .aclk(fir_clk),                              // input wire aclk
//      .m_axis_data_tvalid(dds_m_axis_data_tvalid),     // output wire m_axis_data_tvalid
//      .m_axis_data_tdata(dds_m_axis_data_tdata)        // output wire [15 : 0] m_axis_data_tdata
//    );

//    assign dds_m_axis_data_sin = dds_m_axis_data_tdata[7:0];

endmodule // fir_top













